import { cfetch, interceptors } from './base';

let defaultConfig = {
  showError: true, // 全局错误时，是否使用统一的报错方式
  canEmpty: false, // 传输参数是否可以为空
  returnOrigin: true, // 是否返回整个 response 对象，为 false 只返回 response.data
  withoutCheck: false, // 不使用默认的接口状态校验，直接返回 response
  mock: false, // 是否使用 mock 服务
  timeout: 1000 * 6, // 接口请求超时时间，默认10秒
  // responseType: 'json',
  // credentials: 'include', // 允许 cookie 共享，跨域问题，传Cookie是必须配置
  headers: {
    Accept: 'application/json',
    'Content-Type': 'application/json',
  },
};

// 请求拦截器
interceptors.request.use((config) => {
  const token = '';
  if (token) {
    config.headers['Authorization'] = `Bearer ${token}`;
  }

  let newConfig = { ...defaultConfig, config };
  return newConfig;
});

// 响应拦截器
interceptors.response.use(
  async (response) => {
    // 2xx 状态入口
    if (response.status >= 200 && response.status < 300) {
      return response;
    } else {
      // 非 2xx
      if (defaultConfig.withoutCheck) {
        // 不进行状态状态检测
        return Promise.reject(response);
      }
      return Promise.reject(response);
    }
  },
  (err) => {
    return Promise.reject(err);
  }
);

function request(method, url, data, config) {
  let ops = {
    method,
    ...config,
    body: JSON.stringify(data), // post参数以json的方式传给后端
  };

  if (['GET', 'get'].includes(methods)) {
    function getParamsStr(data) {
      const target = [];
      for (const key in data) {
        target.push(`${key}=${data[key]}`);
      }
      return target.length > 0 ? `?${target.join('&')}` : '';
    }

    // get请求 将参数放到url上
    url = url + getParamsStr(data);
  }

  return cfetch(url, ops)
    .then((res) => {
      if (res.ok) {
        return res.json();
      }
      return Promise.reject({
        message: res.statusText,
        code: res.status,
      });
    })
    .then((data) => {
      return data;
    })
    .catch((err) => err);
}

function get(url, data, config) {
  return request('GET', url, data, config);
}

function post(url, data, config) {
  return request('POST', url, data, config);
}

function del(url, data, config) {
  return request('DELETE', url, data, config);
}

function put(url, data, config) {
  return request('PUT', url, data, config);
}

export { cfetch, get, post, del, put };
